連載 163 ワークステーションのおと 坂下秀 表 1 Evo Desktop D500 US のおもな仕様 前回、秋葉原で ISDN の TA ( ターミナル・アタフ。タ ) CPU lntel CeIeron 1.3GHz とシリアルケープルを買おうとしたら、意外にも置いてい チッフ。セット lntel 815 E る店が少なかったと書きました。その後、これ以外にも、 メモリ ( 最大 ) 128MB ( 512MB ) 、 買おうとして、、ああんまりないんやなぁ " と気づいた 168 ピン DIMM/133MHz 、 DIMM スロット x 2 ものがありました。 1 つはパラレルポート付きのインクジ グラフィックス lntel Direct AGP (lntel 815E ェット・プリンタ、もう 1 つはフロッピー・ディスクです。 チップセットに内蔵 ) インクジェット・プリンタについては、低価格のものは HDD 40GB (Ultra ATA/IOO) CD-ROM ドライプ 最大 24 イ部 ( 着脱式 ) USB のみ、高級機は USB と IEEE1394 という製品構成 サウンド AC'97 サウンド・コントローラ * のメーカーか増えつつあるようです。、、パラレルポートぐ ネットワーク lntel P RO / 100 VM Network らい付いてるやろ " というのは、だんだん通しなくなるの Connection かもしれません。事実、不劫ワ。リンタを購入したときのお インターフェイス USB x 5 、 VGA 、サウンド、レ ガシー・モジュール用ポートなど まけも USB ケーフフレでした。店員さんに、「 USB ケープ サイズ (HxWxD) 31.5 >< 6.9 x 32.5cm 僻従置き日 ルは要らんから、パラレルケープルにしてくれへん ? 」と 約 5.3kg 言ったら、「そちらは〇階で売っております」とかわされ 最大消費電力 50 Ⅵー OS てしまいました。 Windows XP Professional 、 または フロッピー・ディスクも、目立たない場所にひっそりと Windows 2000 Professional 置いてありました。すぐ目につくところにあるのは CD ー R * オンポード や CD-RW などの CD 関連メディア、その次が DVD- R などの DVD 里メディア、そして MO があり、 su- perDisk などとともに、、最丘は使う人か誠りましたなぁ " という感じの棚でようやくフロッピー・ディスクを見つけ こんなことを書いていると、黽呂城に連れていかれそう です。そろそろ本題に入りましよう。 写真 1 刊 vo Desktop D500 US Evo Desktop D500 US 勤務先で、 Compaq の省スペース型デスクトップ pc 「 Evo Desktop D500 US 」 ( 写真 1 ) を購入しました。 そこで、いつものように内部がどのようになっているのか を見てみました。それでは・・ 、その前に仕様を簡単に紹 万円以下で買えるのですから、ひと昔前のことを思い出す 介しておきましよう俵 1 ) 。 と、、いったい、どないなってんねん " という気持ちになり CPU は Celeron 1.3GHz と十分に高速で、これが 10 ます。 UNIX MAGAZINE 2002.6 121
連載 / BSD をハックする一の callback と done のどちらで処理されているかが分 からないので、両方調べてみます。 xfer->callback は、 usbd-setup-xfer() 、 usbd-setup-default-xfer() などで 引数として渡された値を代入しています。 そこで ucom. c を調べると、 ucomstart() と ucom- startread() のなかで usbd-setup-xfer() か呼び出され ています。今回はデータ受信の処理に興未があるので、デ ータ送信用の ucomstart() ではなく ucomstartread() をヾたところ、 usbd-setup-xfer() の該当する引数に渡 しているのは ucomreadcb() でした。 一方、 pipe->methods->done はどうでしよう。 uhci . c のなかの struct usbd-pipe-methods を探したとこ ろ、 uhci-root-ctrl-methods という変数があり、これの done は uhci-root-ctrl-done にネノ琪月化されています。 れを調べると、次のようにまったく空つほ。の関数です。 void uhci—root—ctrl—done (usbd—xfer—handle xfer) これで、 ucomreadcb() について調べれはよいことが 分かったので詳しく読んでみます。おおよそ次のような処 理がおこなわれています。 int (*rint) (int c, struct tty *tp) tp—>t—linesw—>l—rint ; usbd—get—xfer—status (xfer , NULL , (void (*)&cp, &cc, NULL); if (sc—>sc—methods—>ucom—read ! = NULL) sc—>sc_methods—>ucom_read(sc—>sc—parent , sc—>sc—portno, &cp, &cc) ; while (cc— if ((*rint) (*cp + + , tp) sc->sc-methods の型は struct ucom-methods なの で、 grep で才す - と umct. c 、 uplcom. c 、 umodem. c など でこの型の構造体の初期値か定義されています。 uplcom ・ c を調べてみると、 ucom-read フィールドは NULL な ので、 sc->sc-methods->ucom-read の呼出しは発生し ないことが分かります。 tty 里のデバイスドライバでは cc がデータバイト数 カウンタであることが多いのですが、ここでもそうなって いるようです。受信したデータは、 1 バイトすっ *rint() すなわち tp->t 」 inesw->l-rint に渡しています。 120 この tp は struct tty * なので、 t-linesw はラインス イッチへのポインタ (struct linesw * ) です。ラインス イッチ (line switch) は USB シリアルにかぎらす、す べての tty デバイスに共通の処理関数へのポインタ ( から なる構造体の配列 ) です。シリアルポートは、通常の tty ポート (/dev/ttyXX) として使うこともあれは、マウス や SLIP や PPP のために使用することもあります。 れら上位層の機能の切替えを司るのがラインスイッチであ り、ラインスイッチに登録されている処理モジュールを ライン・ディシプリン (line discipline : 線規則 ) と呼び ます。 1 ュⅲ t は、線規則のうちの受信した 1 文字を処理する 関数へのポインタかオ褓内されているフィールドで、通常は ttyinput() (kern/tty. c) になっています。 けっきよく、 ucomreadcb() 内の (*rint)(*cp 十十 , (p) で USB に依存する処理かり、 tty デバイス共通の 受信処理に受信データか渡されるわけです。 これで、受信処理の際に受信したデータを捨てて 1 バ イトを送信する処理を入れるところは、おそらく ucom- readcb() であることが分かりました。 こまできたところで、今回は時間切れとなってしまい ました。続きは次回に紹介します。 デバイスドライバの処理の流れを追いかけるのは大変で す。この連載ではこれまで、いろいろ調べて分かった結 果のみを示していましたが、今回はその過程を詳しく説明 してみました。いかにも大変そうで、やる気がそがれたで しようか ? それとも、カンや経験はなくても首に grep していけばなんとか追いかけられることが分かって、勇気 づけられたでしようか ? UNIX は C 言語で書かれているため、関数のポインタ を多用せざるをえす、見通しか悪くなっています。とはい え、 C だからこれだけ追いかけられるのであって、 C 十十 であればお手上げかもしれません。しかし逆に、 C 十十の ようなオプジェクト指向言語ならクラスプラウサなどの支 援ツールか充実しているので、かえって調べやすいとも考 えられます。実際はどうなのか、興未カヾ勇くところです。 ( さいとう・あきのり友大学 ) UNIX MAGAZINE 2002.6
連載 / BSD をハックする一の ASCII 好評発売中 ! ネットワーク・ テクノロジー ー己から、 usbd-bus という型だと分かります。これを grep で探してみると、 uhci. c にそれらしいものがみつか りました。 uchi-init() のなかに次のような行があります。 / * Set up the bus struct . * / sc—>sc—bus . methods = &uhci_bus_methods ; そこでさらに uhci-bus-methods の定義を探すと、同 しく uhci. c でみつかりました。 struct usbd—bus_methods uhci_bus_methods uhci —open , uhci softintr, Ⅱ五 ci ー P011 , uhci a110cm, uhci freem, uhci allocx, uhci freex, 製ー X ネットワーク - アクノロ。シー インターネットを支える技術・掲ロ第一 ・播ロ陽ー著 ・ A5 判、 448 ページ ・ ISBN 4-7561-4092-0 ・本体 3 , 500 円 + 税 技術の“心”が分かる本 ネットワーク技術者必携 ! 技術には、かならず核心となる部分があります。これ を理解しているかが、その技術を使いこなせるかどう かの分かれ目といえるでしよう。 本書では、現在のインターネットを支えるさまざまな 技術について、開発の背景から、原理、応用まで、 数多くの図版を用いて詳細に解説します。 目次から 1 章 Ethernet 2 章リピータ、ブリッジ、スイッチ 3 章ス / ヾニングッリー 4 章 VLAN 5 章経路制御の基礎 6 章経路検索アルゴリズム 7 章 ATM 8 章 UN レグナリング 9 章 LANE と MPOA 10 章アドレス変換ーー NAT と旧 masquerade 1 1 章 ADSL 参考文献 / 索引 / 英和用語対照表 株式会社アスキー ネットワーク技術者必 インターネットを - する E 置澄 1 滝 t 、一、 A ′、興ロ望 . 、 NAT などのについて、その つまり、 uhci-softintr() を調べればよいわけです。 れは次のような処理をしています。 for ()i = LIST—FIRST(&sc—>sc_intrhead) ; ii ; ii = LIST_NEXT(ii, list)) uhci—check—intr(sc, (i) ; uhci-check-intr() を調べると、エラー処理のはかに は 以下の処理をしているだけです。 usb—uncallout (ii—>xfer—>timeout_handle , uhci—timeout , (i) ; uhci—idone(ii) ; 上の uncallout は、どうもタイムアウトのためのタイ マーをキャンセルしているもののようです。そこで uhci- idone() を調べることにします。これもエラー処理などが 多いのですが、けっきよく転送が正常終了しているとき には、 usb—transfer—complete(xfer) ; を呼び出して終了しています。 usb-transfer-complete() は、 usbdi. c で定義されて いる関数です。この関数では、バッフア領域の割付けやデ ータのバイト数言 t 算、コピーなどがおこなわれています。 そして、最後に次のような処理をしています。 if (xfer—>callback) xfer—>callback(xfer , xfer—>priv , xfer—>status) ; pipe—>methods->done (xfer) ; 〒 1 5 ト 8024 東京都渋谷区代々木 4 ー 33 ー 1 0 出版営業部 電話 (03) 5351 ー 8194 119 UNIX MAGAZINE 2002.6